From b63e5446b86f12f344f984a9d2ba59815e2e9fda Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Mon, 27 Nov 2006 14:20:44 +0000 Subject: [PATCH] [XEN] Cleanups to phys/mach address handling. 1. Balloon driver does not need to set M2P entry. This is done by the populate_physmap hypercall. 2. Xen now translates foreign mappings from GMFN->MFN. Tools are simplified because of this. Signed-off-by: Keir Fraser --- .../arch/i386/mm/hypervisor.c | 12 ------ .../drivers/xen/balloon/balloon.c | 2 - .../asm-i386/mach-xen/asm/hypervisor.h | 1 - linux-2.6-xen-sparse/include/asm-ia64/maddr.h | 5 --- tools/ioemu/vl.c | 22 ----------- tools/libxc/xc_domain.c | 16 -------- tools/libxc/xc_hvm_build.c | 7 ---- tools/libxc/xc_linux_build.c | 6 --- tools/libxc/xc_linux_restore.c | 16 +++----- tools/libxc/xc_private.c | 32 ---------------- tools/libxc/xenctrl.h | 6 --- xen/arch/x86/mm.c | 38 +++++++++---------- 12 files changed, 25 insertions(+), 138 deletions(-) diff --git a/linux-2.6-xen-sparse/arch/i386/mm/hypervisor.c b/linux-2.6-xen-sparse/arch/i386/mm/hypervisor.c index 7263ef4dea..3c20351e92 100644 --- a/linux-2.6-xen-sparse/arch/i386/mm/hypervisor.c +++ b/linux-2.6-xen-sparse/arch/i386/mm/hypervisor.c @@ -99,18 +99,6 @@ void xen_l4_entry_update(pgd_t *ptr, pgd_t val) } #endif /* CONFIG_X86_64 */ -void xen_machphys_update(unsigned long mfn, unsigned long pfn) -{ - mmu_update_t u; - if (xen_feature(XENFEAT_auto_translated_physmap)) { - BUG_ON(pfn != mfn); - return; - } - u.ptr = ((unsigned long long)mfn << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE; - u.val = pfn; - BUG_ON(HYPERVISOR_mmu_update(&u, 1, NULL, DOMID_SELF) < 0); -} - void xen_pt_switch(unsigned long ptr) { struct mmuext_op op; diff --git a/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c b/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c index ae15fd4ef7..b621d76383 100644 --- a/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c +++ b/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c @@ -215,9 +215,7 @@ static int increase_reservation(unsigned long nr_pages) BUG_ON(!xen_feature(XENFEAT_auto_translated_physmap) && phys_to_machine_mapping_valid(pfn)); - /* Update P->M and M->P tables. */ set_phys_to_machine(pfn, frame_list[i]); - xen_machphys_update(frame_list[i], pfn); /* Link back into the page tables if not highmem. */ if (pfn < max_low_pfn) { diff --git a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h index ef82d35728..f7904ac0b0 100644 --- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h +++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h @@ -98,7 +98,6 @@ void xen_pgd_pin(unsigned long ptr); void xen_pgd_unpin(unsigned long ptr); void xen_set_ldt(unsigned long ptr, unsigned long bytes); -void xen_machphys_update(unsigned long mfn, unsigned long pfn); #ifdef CONFIG_SMP #include diff --git a/linux-2.6-xen-sparse/include/asm-ia64/maddr.h b/linux-2.6-xen-sparse/include/asm-ia64/maddr.h index 7a26b2c6cc..cbdef5a96e 100644 --- a/linux-2.6-xen-sparse/include/asm-ia64/maddr.h +++ b/linux-2.6-xen-sparse/include/asm-ia64/maddr.h @@ -96,11 +96,6 @@ mfn_to_local_pfn(unsigned long mfn) #define virt_to_machine(virt) __pa(virt) // for tpmfront.c #define set_phys_to_machine(pfn, mfn) do { } while (0) -#ifdef CONFIG_VMX_GUEST -extern void xen_machphys_update(unsigned long mfn, unsigned long pfn); -#else /* CONFIG_VMX_GUEST */ -#define xen_machphys_update(mfn, pfn) do { } while (0) -#endif /* CONFIG_VMX_GUEST */ typedef unsigned long maddr_t; // to compile netback, netfront diff --git a/tools/ioemu/vl.c b/tools/ioemu/vl.c index 7d41a39299..a2700ef313 100644 --- a/tools/ioemu/vl.c +++ b/tools/ioemu/vl.c @@ -5787,9 +5787,6 @@ int set_mm_mapping(int xc_handle, uint32_t domid, unsigned long nr_pages, unsigned int address_bits, xen_pfn_t *extent_start) { -#if 0 - int i; -#endif xc_dominfo_t info; int err = 0; @@ -5808,19 +5805,6 @@ int set_mm_mapping(int xc_handle, uint32_t domid, return -1; } - err = xc_domain_translate_gpfn_list(xc_handle, domid, nr_pages, - extent_start, extent_start); - if (err) { - fprintf(stderr, "Failed to translate gpfn list\n"); - return -1; - } - -#if 0 /* Generates lots of log file output - turn on for debugging */ - for (i = 0; i < nr_pages; i++) - fprintf(stderr, "set_map result i %x result %lx\n", i, - extent_start[i]); -#endif - return 0; } @@ -6425,12 +6409,6 @@ int main(int argc, char **argv) #if defined(__i386__) || defined(__x86_64__) for ( i = 0; i < tmp_nr_pages; i++) page_array[i] = i; - if (xc_domain_translate_gpfn_list(xc_handle, domid, tmp_nr_pages, - page_array, page_array)) { - fprintf(logfile, "xc_domain_translate_gpfn_list returned error %d\n", - errno); - exit(-1); - } phys_ram_base = xc_map_foreign_batch(xc_handle, domid, PROT_READ|PROT_WRITE, page_array, diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c index ae2b9f6221..b63e172a22 100644 --- a/tools/libxc/xc_domain.c +++ b/tools/libxc/xc_domain.c @@ -430,22 +430,6 @@ int xc_domain_memory_populate_physmap(int xc_handle, return err; } -int xc_domain_translate_gpfn_list(int xc_handle, - uint32_t domid, - unsigned long nr_gpfns, - xen_pfn_t *gpfn_list, - xen_pfn_t *mfn_list) -{ - struct xen_translate_gpfn_list op = { - .domid = domid, - .nr_gpfns = nr_gpfns, - }; - set_xen_guest_handle(op.gpfn_list, gpfn_list); - set_xen_guest_handle(op.mfn_list, mfn_list); - - return xc_memory_op(xc_handle, XENMEM_translate_gpfn_list, &op); -} - int xc_domain_max_vcpus(int xc_handle, uint32_t domid, unsigned int max) { DECLARE_DOMCTL; diff --git a/tools/libxc/xc_hvm_build.c b/tools/libxc/xc_hvm_build.c index fe301207f1..4a0e884841 100644 --- a/tools/libxc/xc_hvm_build.c +++ b/tools/libxc/xc_hvm_build.c @@ -245,13 +245,6 @@ static int setup_guest(int xc_handle, goto error_out; } - if ( xc_domain_translate_gpfn_list(xc_handle, dom, nr_pages, - page_array, page_array) ) - { - PERROR("Could not translate addresses of HVM guest.\n"); - goto error_out; - } - loadelfimage(image, xc_handle, dom, page_array, &dsi); if ( set_hvm_info(xc_handle, dom, page_array, vcpus, acpi) ) diff --git a/tools/libxc/xc_linux_build.c b/tools/libxc/xc_linux_build.c index 9c03f067e7..9bd4a5e3f4 100644 --- a/tools/libxc/xc_linux_build.c +++ b/tools/libxc/xc_linux_build.c @@ -509,12 +509,6 @@ static int setup_guest(int xc_handle, PERROR("Could not allocate memory for PV guest.\n"); goto error_out; } - if ( xc_domain_translate_gpfn_list(xc_handle, dom, nr_pages, - page_array, page_array) ) - { - PERROR("Could not translate addresses of PV guest.\n"); - goto error_out; - } dsi.v_start = round_pgdown(dsi.v_start); vinitrd_start = round_pgup(dsi.v_end); diff --git a/tools/libxc/xc_linux_restore.c b/tools/libxc/xc_linux_restore.c index c31a1bdb7c..1d28226bd6 100644 --- a/tools/libxc/xc_linux_restore.c +++ b/tools/libxc/xc_linux_restore.c @@ -265,13 +265,16 @@ int xc_linux_restore(int xc_handle, int io_fd, } shared_info_frame = domctl.u.getdomaininfo.shared_info_frame; - if(xc_domain_setmaxmem(xc_handle, dom, PFN_TO_KB(max_pfn)) != 0) { + if (xc_domain_setmaxmem(xc_handle, dom, PFN_TO_KB(max_pfn)) != 0) { errno = ENOMEM; goto out; } - if(xc_domain_memory_increase_reservation( - xc_handle, dom, max_pfn, 0, 0, NULL) != 0) { + for ( pfn = 0; pfn < max_pfn; pfn++ ) + p2m[pfn] = pfn; + + if (xc_domain_memory_populate_physmap(xc_handle, dom, max_pfn, + 0, 0, p2m) != 0) { ERROR("Failed to increase reservation by %lx KB", PFN_TO_KB(max_pfn)); errno = ENOMEM; goto out; @@ -279,18 +282,11 @@ int xc_linux_restore(int xc_handle, int io_fd, DPRINTF("Increased domain reservation by %lx KB\n", PFN_TO_KB(max_pfn)); - /* Build the pfn-to-mfn table. We choose MFN ordering returned by Xen. */ - if (xc_get_pfn_list(xc_handle, dom, p2m, max_pfn) != max_pfn) { - ERROR("Did not read correct number of frame numbers for new dom"); - goto out; - } - if(!(mmu = xc_init_mmu_updates(xc_handle, dom))) { ERROR("Could not initialise for MMU updates"); goto out; } - DPRINTF("Reloading memory pages: 0%%\n"); /* diff --git a/tools/libxc/xc_private.c b/tools/libxc/xc_private.c index a2600fdc1b..d8dbb5e0dd 100644 --- a/tools/libxc/xc_private.c +++ b/tools/libxc/xc_private.c @@ -134,10 +134,7 @@ int xc_memory_op(int xc_handle, DECLARE_HYPERCALL; struct xen_memory_reservation *reservation = arg; struct xen_machphys_mfn_list *xmml = arg; - struct xen_translate_gpfn_list *trans = arg; xen_pfn_t *extent_start; - xen_pfn_t *gpfn_list; - xen_pfn_t *mfn_list; long ret = -EINVAL; hypercall.op = __HYPERVISOR_memory_op; @@ -186,28 +183,6 @@ int xc_memory_op(int xc_handle, goto out1; } break; - case XENMEM_translate_gpfn_list: - if ( lock_pages(trans, sizeof(*trans)) != 0 ) - { - PERROR("Could not lock"); - goto out1; - } - get_xen_guest_handle(gpfn_list, trans->gpfn_list); - if ( lock_pages(gpfn_list, trans->nr_gpfns * sizeof(xen_pfn_t)) != 0 ) - { - PERROR("Could not lock"); - unlock_pages(trans, sizeof(*trans)); - goto out1; - } - get_xen_guest_handle(mfn_list, trans->mfn_list); - if ( lock_pages(mfn_list, trans->nr_gpfns * sizeof(xen_pfn_t)) != 0 ) - { - PERROR("Could not lock"); - unlock_pages(gpfn_list, trans->nr_gpfns * sizeof(xen_pfn_t)); - unlock_pages(trans, sizeof(*trans)); - goto out1; - } - break; } ret = do_xen_hypercall(xc_handle, &hypercall); @@ -232,13 +207,6 @@ int xc_memory_op(int xc_handle, case XENMEM_add_to_physmap: unlock_pages(arg, sizeof(struct xen_add_to_physmap)); break; - case XENMEM_translate_gpfn_list: - get_xen_guest_handle(mfn_list, trans->mfn_list); - unlock_pages(mfn_list, trans->nr_gpfns * sizeof(xen_pfn_t)); - get_xen_guest_handle(gpfn_list, trans->gpfn_list); - unlock_pages(gpfn_list, trans->nr_gpfns * sizeof(xen_pfn_t)); - unlock_pages(trans, sizeof(*trans)); - break; } out1: diff --git a/tools/libxc/xenctrl.h b/tools/libxc/xenctrl.h index 42b09323a7..c646d18ea8 100644 --- a/tools/libxc/xenctrl.h +++ b/tools/libxc/xenctrl.h @@ -439,12 +439,6 @@ int xc_domain_memory_populate_physmap(int xc_handle, unsigned int address_bits, xen_pfn_t *extent_start); -int xc_domain_translate_gpfn_list(int xc_handle, - uint32_t domid, - unsigned long nr_gpfns, - xen_pfn_t *gpfn_list, - xen_pfn_t *mfn_list); - int xc_domain_ioport_permission(int xc_handle, uint32_t domid, uint32_t first_port, diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index c7dc88d503..b87bc97c5b 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -1240,6 +1240,10 @@ static int mod_l1_entry(l1_pgentry_t *pl1e, l1_pgentry_t nl1e, if ( l1e_get_flags(nl1e) & _PAGE_PRESENT ) { + /* Translate foreign guest addresses. */ + nl1e = l1e_from_pfn(gmfn_to_mfn(FOREIGNDOM, l1e_get_pfn(nl1e)), + l1e_get_flags(nl1e)); + if ( unlikely(l1e_get_flags(nl1e) & L1_DISALLOW_MASK) ) { MEM_LOG("Bad L1 flags %x", @@ -1814,12 +1818,17 @@ static int set_foreigndom(domid_t domid) if ( likely(domid == DOMID_SELF) ) goto out; - if ( domid == d->domain_id ) + if ( unlikely(domid == d->domain_id) ) { MEM_LOG("Dom %u tried to specify itself as foreign domain", d->domain_id); okay = 0; } + else if ( unlikely(shadow_mode_translate(d)) ) + { + MEM_LOG("Cannot mix foreign mappings with translated domains"); + okay = 0; + } else if ( !IS_PRIV(d) ) { switch ( domid ) @@ -1857,14 +1866,6 @@ static int set_foreigndom(domid_t domid) } } - if ( unlikely(shadow_mode_translate(d)) ) - { - MEM_LOG("%s: can not mix foreign mappings with translated domains", - __func__); - info->foreign = NULL; - okay = 0; - } - out: return okay; } @@ -2340,13 +2341,15 @@ int do_mmu_update( break; } - if ( shadow_mode_translate(FOREIGNDOM) ) - shadow_guest_physmap_add_page(FOREIGNDOM, gpfn, mfn); - else - set_gpfn_from_mfn(mfn, gpfn); + if ( unlikely(shadow_mode_translate(FOREIGNDOM)) ) + { + MEM_LOG("Mach-phys update on shadow-translate guest"); + break; + } + + set_gpfn_from_mfn(mfn, gpfn); okay = 1; - // Mark the new gfn dirty... mark_dirty(FOREIGNDOM, mfn); put_page(mfn_to_page(mfn)); @@ -2557,10 +2560,7 @@ static int destroy_grant_va_mapping( } ol1e = *pl1e; - /* - * Check that the virtual address supplied is actually mapped to - * frame. - */ + /* Check that the virtual address supplied is actually mapped to frame. */ if ( unlikely(l1e_get_pfn(ol1e) != frame) ) { MEM_LOG("PTE entry %lx for address %lx doesn't match frame %lx", @@ -2574,7 +2574,7 @@ static int destroy_grant_va_mapping( { MEM_LOG("Cannot delete PTE entry at %p", (unsigned long *)pl1e); rc = GNTST_general_error; - goto out; // this is redundant & unnecessary, but informative + goto out; } out: -- 2.30.2